package com.cy.store.controller;

import com.cy.store.controller.ex.*;
import com.cy.store.domain.District;
import com.cy.store.domain.User;
import com.cy.store.service.IUserService;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @author Administrator
 * @version 1.0
 * @description: TODO
 * @date 2025/2/18 20:58
 */
@RestController //其作用等同于@Controller+@ResponseBody
//@Controller
@RequestMapping("users")
public class UserController extends BaseController {

    @Autowired
    private IUserService userService;

    @RequestMapping("reg")
    //@ResponseBody //表示此方法的响应结果以json格式进行数据的响应给到前端
    public JsonResult<Void> reg(User user) {
        userService.reg(user);
        return new JsonResult<>(OK);
    }

    @RequestMapping("login")
    public JsonResult<User> login(String username, String password, HttpSession session) {
        User data = userService.login(username, password);

        //向session对象中完成数据的绑定(这个session是全局的,项目的任何位置都可以访问)
        session.setAttribute("uid",data.getUid());
        session.setAttribute("username",data.getUsername());

        //测试能否正常获取session中存储的数据
        System.out.println(getUidFromSession(session));
        System.out.println(getUsernameFromSession(session));

        return new JsonResult<User>(OK,data);
    }
    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session) {
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        userService.changePassword(uid,username,oldPassword,newPassword);
        return new JsonResult<>(OK);
    }
    @RequestMapping("get_by_uid")
    public JsonResult<User> getInfo(HttpSession session) {
        User data = userService.getByUid(getUidFromSession(session));
        return new JsonResult<>(OK,data);
    }
    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user,HttpSession session) {
        Integer uid = getUidFromSession(session);
        userService.changeInfo(uid,user);
        return new JsonResult<>(OK);
    }
    @RequestMapping("change_avatar")
    public JsonResult<String> changeAvatar(HttpSession session, MultipartFile file) {
        /**
         * 1.参数名为什么是file：在upload.html页面的147行<input type="file" name = "file"，所以这个参数名就是file
         * 用于接收前端上传的文件，如果想要参数名和前端的name不一致，那么需要在@RequestParam(value = "file") MultipartFile fffff；把
         * 表单表单中的name = "file"的控件值传递给fffff，那么就需要在@RequestParam(value = "file") MultipartFile fffff;
         * 2.为什么参数类型必须是MultipartFile：这是因为springmvc框架已经封装好了一个类，这个类就是MultipartFile，
         * 如果类型是并且参数名与前端上传文件的name一致，则会自动把整体的数据包传递给file
         */
        if(file.isEmpty()){
            throw new FileEmptyException("上传文件为空");
        }
        if(file.getSize()>AVATAR_MAX_SIZE){
            throw new FileSizeException("文件大小超出限制");
        }
//        判断文件的类型是否超出范围
        String contentType = file.getContentType();
//        如果集合包含某个元素，则返回true
        if(!AVATAR_MIME_TYPE.contains(contentType)){
            throw new FileTypeException("文件类型超出范围");
        }
        //上传文件路径：../upload/文件名.png
        /**
         * session.getServletContext()获取当前Web应用程序的上下文对象，
         * 每次启动Tomcat都会创还能一个新的上下文对象
         * 然后调用getRealPath（“/upload”）的/代表当前Web应用程序的根目录通过该
         * 相对路径获取绝对路径，返回的是一个字符串，该字符串就是当前Web应用程序的根目录的绝对路径
         * 如果不能进行进行映射返回null,
         * 单斜杠可以要可不要
         */
        String parent =
                session.getServletContext().getRealPath("/upload");
        System.out.println(parent);
        //File对象指向这个路径，通过判断File是否存在，得到该路径是否存在
        File dir = new File(parent);
        if(!dir.exists()){//检测目录是否存在
            dir.mkdirs();
        }
//        生成一个文件名（前缀），找到源文件的后缀，组合为一个新的文件名（完整）
        String originalFilename = file.getOriginalFilename();
        System.out.println("生成文件名：" + originalFilename);
        int index = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(index);
        String filename =
            UUID.randomUUID().toString().toUpperCase()+suffix;
        //在dir目录下创建filename文件（此时是空文件）
        File dest = new File(dir,filename);
        try{
            file.transferTo(dest);//transferTo是一个封装的方法，用来把文件写入到指定的文件中
        }catch (FileStateException e){
            throw new FileStateException("文件状态异常");
        }catch (IOException e){
            throw new FileUploadIOException("文件读写异常");
        }
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        String avatar = "/upload/" + filename;
//        将头像相对路径写入到数据库中
        userService.changeAvatar(uid,avatar,username);
        return new JsonResult<>(OK,avatar);

    }


}
